iT邦幫忙

2021 iThome 鐵人賽

DAY 23
1

回到我們的目標

我們希望能測試 updateUsersTags(),傳入參數 filter時,會執行到該參數。並成功的將該參數處理後的 tag 加到 user 內。

這邊我們命名這個情境為 測試成功使用 filter 參數的回傳值()

那麼,我們怎麼在不使用到 removeTag() 函數的狀況下,測試出這個情境呢?

宣告 stub

首先,我們先宣告一個自己的 stub filterStub

val target = makeTestTags(1)
val filterStub: List<Tag>.() -> List<Tag> = { target }

filterStub() 被呼叫之後,固定只會回傳 target

接著,我們設定進行測試狀況如下

val (testUser) = makeTestUsers(1)
val (testTag) = makeTestTags(1)
updateUsersTags(
	listOf(testUser),
	listOf(testTag),
	filterStub
)

設定的方式和之前並沒有太大差異。

如果順利呼叫到 filterStub 的話,我們會預期 testUser.tags 裡面不會有 testTag,但是會剛好等於 target

assertThat(testUser.tags.toList(), not(hasItem(testTag)))
assertThat(testUser.tags.toList(), `is`(target))

整體測試看起來是這樣

@Test
fun `測試成功使用 filter 參數的回傳值`() {
	initDatabase()
	transaction {
		val target = makeTestTags(1)
		val filterStub: List<Tag>.() -> List<Tag> = { target }
		val (testUser) = makeTestUsers(1)
		val (testTag) = makeTestTags(1)
		updateUsersTags(
			listOf(testUser),
			listOf(testTag),
			filterStub
		)
		assertThat(testUser.tags.toList(), not(hasItem(testTag)))
		assertThat(testUser.tags.toList(), `is`(target))
	}
}

運行測試之後,如果順利的話,我們會發現案例成功通過,我們針對 updateUsersTags() 的一個單元測試就大功告成囉!


上一篇
[Day 22] 談 test double 的五種類型
下一篇
[Day 24] 新功能又來了!時間相關的測試!
系列文
Kotlin 怎麼操作資料庫?談談 Kotlin Exposed 框架30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言